﻿#pragma once
#include "DLL.h"
#include "CReferenceCounter.h"
#include "Error.h"

// Wyłączam informacje że std potrzebuje interfesju do dll.
#pragma warning( disable : 4251 )

namespace DarkStorm2D {

	//! Interfejs zasobu, zawiera podstawowe operacje wykonywane na zasobach.
	/*!
	 * Dziedziczy po liczniku referencji, więc można go użyć jako inwazyjny inteligentny wskaźnik.
	 */
	class DLLDARKSTORM2D IResource : public CRefCounter 
	{
	protected:
		//! Nazwa pliku z którego pochodzi zasób.
		std::string m_Filename;
		//! Typ zasobu.
		int m_Type;

		//! Czy jest załadowany z pliku.
		bool m_IsLoad;
	public:
		//! Zawiera typy zasobów
		enum ETypeResource
		{
			//! Brak typu.
			RES_TYPE_NONE,
			//! Typ nie znany.
			RES_TYPE_UNKNOWN,
			//! Typ użytkownika.
			RES_TYPE_USER,
			//! Obraz.
			RES_TYPE_IMAGE,
			//! Animacja.
			RES_TYPE_ANIMATION,
			//! Czcionka.
			RES_TYPE_FONT,
			//! Sprite.
			RES_TYPE_SPRITE,
			//! Dźwięk
			RES_TYPE_SOUND,
			//...
			//RES_TYPE_
		};

		// Konstruktor domyślny
		IResource() {m_Filename = ""; m_Type = RES_TYPE_NONE;}
		virtual ~IResource() {m_Filename = ""; m_Type = RES_TYPE_NONE;}

		/*! Ładuje zasób z pliku.
		 * @param Filename Nazwa pliku.
		 * @return Błąd, jaki może wystąpić podczas ładowania.
		 */
		virtual const CError& LoadFromFile(const std::string & Filename) = 0;

		/*! Sprawdza czy załadowano zasób.
		 * @return true - załadowany false - nie załadowany;
		 */
		bool IsLoad() {return m_IsLoad;}

		/*! Ładuje zasób jeszcze raz.
		 * @return Błąd, jaki może wystąpić podczas ładowania.
		 */
		virtual const CError& Reload() = 0;

		/*! Zmienia nazwę pliku.
		 * @param Filename Nowa nazwa pliku.
		 */
		void SetFilename(const std::string & Filename) {m_Filename = Filename;};
		/*!
		 * @return Nazwa pliku z którego pochodzi zasób.
		 */
		const std::string GetFilename() {return m_Filename;}

		/*! Zmienia typ zasobu.
		 * @param Type Nowy typ zasobu.
		 */
		void SetType(int Type) {m_Type = Type;}
		/*!
		 * @return Typ zasobu.
		 */
		int GetType() {return m_Type;}
		
	};
	typedef boost::intrusive_ptr<IResource> ResPtr;

};

